﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using YKhoa_Lib.BLL;

namespace YKhoa_Lib.DAL
{
    public class DAL_ChiDinh : SqlConnectionRun
    {
        #region Tạm thời không dùng
        public string TaoMaPhieuMoi()
        {
            //Mã phiếu chỉ định có dạng: [CD][2 số cuối của năm][2 số của tháng][2 số của ngày][4 số thứ tự trong ngày]
            //VD:CD1407150001 => Phiếu đầu tiên trong ngày 15/7/2014
            string MaPhieu = "CD";
            string SoCuoiCuaNam = DateTime.Now.Year.ToString().Substring(2, 2); //2 số cuối
            string SoCuoiCuaThang = DateTime.Now.Month.ToString();
            if (SoCuoiCuaThang.Length == 1) SoCuoiCuaThang = "0" + SoCuoiCuaThang;
            string SoNgay = DateTime.Now.Day.ToString();
            if (SoNgay.Length == 1) SoNgay = "0" + SoNgay;
            string pathDate = SoCuoiCuaNam + SoCuoiCuaThang + SoNgay;
            MaPhieu += pathDate;
            //Lấy mã phiếu hiện tại
            string sql = @"SELECT MaPhieu FROM Vienphi..BangMaVP WITH(rowlock, xlock) WHERE MaKyHieu='CD'";
            object obj = SqlExecuteQueryScalar(sql);
            if(obj != null)
            {                                
                string MaCDHienTai = obj.ToString();
                int SoTTHienTai = 0;
                int SoTiepTheo = 0;
                //Lấy ngày hiện tại trên mã phiếu hiện tại
                string eyear = MaCDHienTai.Substring(2, 2);
                string emonth = MaCDHienTai.Substring(4, 2);
                string eday = MaCDHienTai.Substring(6, 2);
                string eDate = eyear + emonth + eday;
                //Kiểm tra ngày trên mã phiếu hiện tại có trùng với ngày hiện tại không
                //Có: tăng mã số lên
                //Không: bắt đầu từ 1
                if (eDate == pathDate)
                {
                    SoTTHienTai = int.Parse(MaCDHienTai.Substring(MaCDHienTai.Length - 4, 4));
                    SoTiepTheo = SoTTHienTai + 1;
                }
                else
                    SoTiepTheo = 1;
                for(int i = 0;i < 4 - SoTiepTheo.ToString().Length;i++)
                {
                    MaPhieu += "0";
                }
                MaPhieu += SoTiepTheo;
                CapNhatBangMaVP(MaPhieu);
            }           
            return MaPhieu;
        }

        private bool CapNhatBangMaVP(string newMaPhieu)
        {
            string sql = @"UPDATE Vienphi..BangMaVP SET Ngay=getdate(), MaPhieu=@MaPhieu WHERE MaKyHieu='CD'";
            List<SqlParameter> param = new List<SqlParameter>();
            param.Add(new SqlParameter("MaPhieu", newMaPhieu));
            int rs = SqlExecuteNoneQuery(sql, param);
            return rs > 0;
        }
        #endregion

        public bool LuuChiDinh(So_ChiDinh _obj)
        {
            sqlConnection.Open();
            SqlTransaction transaction = sqlConnection.BeginTransaction();
            SqlCommand sqlCommand = sqlConnection.CreateCommand();
            sqlCommand.Transaction = transaction;
            try
            {
                //Nếu MaPhieu == "" là lưu mới, tiến hành tạo mã phiếu mới
                if(_obj.MaPhieu == "")
                {
                    //Mã phiếu chỉ định có dạng: [CD][2 số cuối của năm][2 số của tháng][2 số của ngày][4 số thứ tự trong ngày]
                    //VD:CD1407150001 => Phiếu đầu tiên trong ngày 15/7/2014
                    string MaPhieu = "CD";
                    string SoCuoiCuaNam = DateTime.Now.Year.ToString().Substring(2, 2); //2 số cuối
                    string SoCuoiCuaThang = DateTime.Now.Month.ToString();
                    if (SoCuoiCuaThang.Length == 1) SoCuoiCuaThang = "0" + SoCuoiCuaThang;
                    string SoNgay = DateTime.Now.Day.ToString();
                    if (SoNgay.Length == 1) SoNgay = "0" + SoNgay;
                    string pathDate = SoCuoiCuaNam + SoCuoiCuaThang + SoNgay;
                    MaPhieu += pathDate;
                    //Lấy mã phiếu hiện tại
                    sqlCommand.CommandText = @"SELECT MaPhieu FROM Vienphi..BangMaVP WITH(rowlock, xlock) WHERE MaKyHieu='CD'";
                    object obj = sqlCommand.ExecuteScalar();
                    if (obj != null)
                    {
                        string MaCDHienTai = obj.ToString();
                        int SoTTHienTai = 0;
                        int SoTiepTheo = 0;
                        //Lấy ngày hiện tại trên mã phiếu hiện tại
                        string eyear = MaCDHienTai.Substring(2, 2);
                        string emonth = MaCDHienTai.Substring(4, 2);
                        string eday = MaCDHienTai.Substring(6, 2);
                        string eDate = eyear + emonth + eday;
                        //Kiểm tra ngày trên mã phiếu hiện tại có trùng với ngày hiện tại không
                        //Có: tăng mã số lên
                        //Không: bắt đầu từ 1
                        if (eDate == pathDate)
                        {
                            SoTTHienTai = int.Parse(MaCDHienTai.Substring(MaCDHienTai.Length - 4, 4));
                            SoTiepTheo = SoTTHienTai + 1;
                        }
                        else
                            SoTiepTheo = 1;
                        for (int i = 0; i < 4 - SoTiepTheo.ToString().Length; i++)
                        {
                            MaPhieu += "0";
                        }
                        MaPhieu += SoTiepTheo;
                        _obj.MaPhieu = MaPhieu;
                        //Cập nhật lại bảng BangMaVP
                        sqlCommand.CommandText = @"UPDATE Vienphi..BangMaVP SET Ngay=getdate(), MaPhieu=@MaPhieu WHERE MaKyHieu='CD'";
                        List<SqlParameter> param = new List<SqlParameter>();
                        param.Add(new SqlParameter("MaPhieu", MaPhieu));
                        sqlCommand.Parameters.AddRange(param.ToArray());
                        sqlCommand.ExecuteNonQuery();                        
                    }           
                }
                sqlCommand.CommandText = @"INSERT INTO Vienphi..So_ChiDinh(MaPhieu, MaPK, 
                                                                            Ngay, MaBN, DoiTuong, 
                                                                            MaNV, NguoiChiDinh, 
                                                                            NoiChiDinh, TongTien, 
                                                                            DaSuDung, MaDotKham, UuTien) 
                                           VALUES ('" + _obj.MaPhieu + "', '" + _obj.MaPhieuKham + "', CONVERT(DATETIME,'" + _obj.Ngay.ToString() + "', 103), '" + _obj.MaBN + "', '" + _obj.DoiTuong + "', '" + _obj.MaNV + "', N'" + _obj.NguoiChiDinh + "', '" + _obj.NoiChiDinh + "', " + _obj.TongTien + ", '" + _obj.DaSuDung + "', '" + _obj.MaDotKham + "', '" + _obj.UuTien + "')";
                int rs = sqlCommand.ExecuteNonQuery();
                if (rs > 0)
                {
                    string insertCTCD = @"INSERT INTO Vienphi..ChiTiet_ChiDinh(MaPhieu, MaDV, TenDichVu, SoLuong, DonGia, ThanhTien, MaKhoa, TenBS, Phong, SuDung, ghichu, bh_kochi) VALUES";
                    foreach (ChiTiet_ChiDinh CTCD in _obj.ChiTietChiDinhs)
                    {
                        insertCTCD += "('" + _obj.MaPhieu + "', '" + CTCD.MaDV + "', N'" + CTCD.TenDichVu + "', " + CTCD.SoLuong + ", " + CTCD.DonGia + ", " + CTCD.ThanhTien + ", '" + CTCD.MaKhoa + "', N'" + CTCD.TenBS + "', '" + CTCD.Phong + "', '" + CTCD.SuDung + "', N'" + CTCD.GhiChu + "', '" + CTCD.BH_KhongChi + "'), ";
                    }
                    insertCTCD = insertCTCD.TrimEnd(',', ' ');
                    sqlCommand.CommandText = insertCTCD;
                    sqlCommand.ExecuteNonQuery();
                }
                transaction.Commit();
                return true;
            }
            catch (Exception e)
            {
                transaction.Rollback();
                return false;
            }
            finally
            {
                transaction.Dispose();
                sqlCommand.Dispose();
                sqlConnection.Close();
            }
        }

        public bool CapNhatChiDinh(So_ChiDinh _obj)
        {
            sqlConnection.Open();
            SqlCommand sqlCommand = sqlConnection.CreateCommand();
            SqlTransaction sqlTransaction = sqlConnection.BeginTransaction();
            sqlCommand.Transaction = sqlTransaction;
            try
            {
                List<SqlParameter> parameters = new List<SqlParameter>();
                sqlCommand.CommandText = @"UPDATE Vienphi..So_ChiDinh SET   MaPhieu=@MaPhieu,
                                                                            MaPK=@MaPK,
                                                                            Ngay=@Ngay,
                                                                            MaBN=@MaBN,
                                                                            DoiTuong=@DoiTuong,
                                                                            MaNV=@MaNV,
                                                                            NguoiChiDinh=@NguoiChiDinh,
                                                                            NoiChiDinh=@NoiChiDinh,
                                                                            TongTien=@TongTien,
                                                                            DaSuDung=@DaSuDung,
                                                                            MaDotKham=@MaDotKham,
                                                                            UuTien=@UuTien";
                parameters.Add(new SqlParameter("MaPhieu", _obj.MaPhieu));
                parameters.Add(new SqlParameter("MaPK", _obj.MaPhieuKham));
                SqlParameter paramNgay = new SqlParameter("Ngay", SqlDbType.DateTime);
                paramNgay.Value = _obj.Ngay;
                parameters.Add(paramNgay);
                parameters.Add(new SqlParameter("MaBN", _obj.MaBN));
                parameters.Add(new SqlParameter("DoiTuong", _obj.DoiTuong));
                parameters.Add(new SqlParameter("MaNV", _obj.MaNV));
                parameters.Add(new SqlParameter("NguoiChiDinh", _obj.NguoiChiDinh));
                parameters.Add(new SqlParameter("NoiChiDinh", _obj.NoiChiDinh));
                parameters.Add(new SqlParameter("TongTien", _obj.TongTien));
                parameters.Add(new SqlParameter("DaSuDung", _obj.DaSuDung));
                parameters.Add(new SqlParameter("MaDotKham", _obj.MaDotKham));
                parameters.Add(new SqlParameter("UuTien", _obj.UuTien));
                sqlCommand.Parameters.AddRange(parameters.ToArray());
                sqlCommand.ExecuteNonQuery();
                //delete all chi tiết chỉ định cũ để chèn mới vào
                sqlCommand.CommandText = @"DELETE FROM Vienphi..ChiTiet_ChiDinh WHERE MaPhieu=@MaPhieu";
                parameters.Clear();
                sqlCommand.Parameters.Clear();
                parameters.Add(new SqlParameter("MaPhieu", _obj.MaPhieu));
                sqlCommand.Parameters.AddRange(parameters.ToArray());
                sqlCommand.ExecuteNonQuery();
                //insert dữ liệu mới vào
                string insertCTCD = @"INSERT INTO Vienphi..ChiTiet_ChiDinh(MaPhieu, MaDV, TenDichVu, SoLuong, DonGia, ThanhTien, MaKhoa, TenBS, Phong, SuDung, ghichu, bh_kochi) VALUES";
                foreach (ChiTiet_ChiDinh CTCD in _obj.ChiTietChiDinhs)
                {
                    insertCTCD += "('" + CTCD.MaPhieu + "', '" + CTCD.MaDV + "', N'" + CTCD.TenDichVu + "', " + CTCD.SoLuong + ", " + CTCD.DonGia + ", " + CTCD.ThanhTien + ", '" + CTCD.MaKhoa + "', N'" + CTCD.TenBS + "', '" + CTCD.Phong + "', '" + CTCD.SuDung + "', N'" + CTCD.GhiChu + "', '" + CTCD.BH_KhongChi + "')";
                }
                sqlCommand.CommandText = insertCTCD;
                sqlCommand.ExecuteNonQuery();
                sqlTransaction.Commit();
                return true;
            }catch(Exception e)
            {
                sqlTransaction.Rollback();
                return false;
            }
            finally
            {
                sqlTransaction.Dispose();
                sqlCommand.Dispose();
                sqlConnection.Close();
            }
        }

        public bool KiemTraDotKham(string MaBN, string MaDotKham)
        {
            string sql = @"SELECT * FROM Vienphi..tbdotkham where MaBN=@MaBN AND MaDotKham=@MaDotKham AND ketthuc=1";
            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("MaBN", MaBN));
            parameters.Add(new SqlParameter("MaDotKham", MaDotKham));
            DataTable dt = SqlExecuteQueryReader(sql, parameters);
            if (dt.Rows.Count > 0)
                return true;
            else
                return false;
        }

        public bool KiemTraSuDung(string _maphieu)
        {
            string sql = @"SELECT * FROM Vienphi..So_ChiDinh WHERE MaPhieu=@MaPhieu";
            List<SqlParameter> parameters = new List<SqlParameter>();
            parameters.Add(new SqlParameter("MaPhieu", _maphieu));
            DataTable dt = SqlExecuteQueryReader(sql, parameters);
            if (dt.Rows.Count > 0)
                return true;
            else
                return false;
        }
    }
}